<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 方式1：字面量的方式来定义对象
        let user={
            name:"tom",
            age:24
        };
        // 方式二：构造函数
        function Student(name,age){
            this.name=name;
            this.age=age;
        }

        // 向原型对象中添加了方法，为该构造函数所创建的实例对象提供统一的方法模板
        Student.prototype.say=function(){
            console.log(`my name is ${this.name}`);
        };
        let stu=new Student("Jack",20);
        let stu2=new Student("cici",23);
       
        stu.say();
        stu2.say();

        //方式三:Object.create(prototype[,对象的属性的配置])
            // prototype:可以是一个实例对象，可以是一个固定的原型，可以是null
            // 对象的属性的配置:取值是一个对象
        let obj=Object.create(null,{
            name:{
                value:"cici",
                writable:true,//是否允许被修改
                enumerable:true,//是否允许被遍历
                configurable:true//是否允许被删除
            },
            age:{
                value:20,
                writable:true,
                enumerable:true,
                configurable:true
            }
        });
        console.log(obj);
      
        console.log(Object.getPrototypeOf(obj));//用于获取对象的原型对象


        // ES6中通过新增的关键语法class，将程序开发模式推进到OOP编程模式(面向对象开发)
        //方式四:class 对象构造器创建 
        // 语法: class 构造器名称{构造体}
        class Book{
            // 在class构造体内，通过constructor关键函数，替换原始的构造方法，constructor内部的this指向于class被创建时返回的实例对象
            constructor(bookName,author){   
                this.bookName=bookName;
                this.author=author;
            }

            //在class构造体内定义的普通方法就是原型对象中的方法
            printInfo(){
                console.log(`this is《${this.bookName}》`);
            }
        }
        let book=new Book("ES6入门手册","周悦");
        let book2=new Book("ES6入门手册2","周悦2");
        console.log(book);
        console.log(book2);
        book.printInfo();
        book2.printInfo();
    </script>

</head>
<body>
    
</body>
</html>